package cn.edu.jxust.core.infrastructure.util;

import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 * @author QiuKangming
 * @version 1.0
 * @description 日期工具类
 * @since 2020/07/16 13:01
 */

@Slf4j
@SuppressWarnings("unused")
public class DateUtils {

    /**
     * 根据当前毫秒值, 返回上一个小时的日期和时间段
     * @param currentMillisecond 当前毫秒值
     * @return string[] 包含三个值: date , last hour time, now hour time;
     */
    public static String[] getLastHourDateAndTime(long currentMillisecond){

        long hour = 60 * 60 * 1000L;//一小时毫秒数
        //上一个小时的时间戳
        long lastHour = currentMillisecond - hour;

        String _date = DateUtil.format(new Date(lastHour), "yyyy-MM-dd");//日期
        String _lastHour = DateUtil.format(new Date(lastHour), "HH:mm:ss");//上一个时间
        String _currentHour;
        if(_lastHour.equals("23:00:00")){
            _currentHour = "23:59:59";
        }else{
            _currentHour = DateUtil.format(new Date(currentMillisecond - 1000L), "HH:mm:ss");//当前时间前一秒
        }
        return new String[]{ _date, _lastHour, _currentHour};
    }

    /**
     * 获取前一天的日期和时间段
     * @param currentMillisecond 当前毫秒值
     * @return String[]
     */
    public static String[] getLastDayDateAndTime(long currentMillisecond){

        //返回昨天一天的时间段: 2020-07-15, 00:00:00, 23:59:59

        long day = 60 * 60 * 1000L * 24;//一天毫秒数
        //前一天的时间戳
        long lastDay = currentMillisecond - day;

        String _date = DateUtil.format(new Date(lastDay), "yyyy-MM-dd");//日期
        String _beginTime = "00:00:00";//上一个时间
        String _endTimer = "23:59:59";//当前时间

        return new String[]{ _date, _beginTime, _endTimer};

    }

    /**
     * 返回前一天的日期时间
     * @param currentMillisecond 当前毫秒值
     * @return String[]
     */
    public static String[] getLastDayDateTime(long currentMillisecond){

        //返回昨天一天的时间段: 2020-07-15, 00:00:00, 23:59:59

        long day = 60 * 60 * 1000L * 24;//一天毫秒数
        //前一天的时间戳
        long lastDay = currentMillisecond - day;

        String _date = DateUtil.format(new Date(lastDay), "yyyy-MM-dd");//日期
        String _beginTime = _date + " 00:00:00";//上一个时间
        String _endTimer = _date + " 23:59:59";//当前时间

        return new String[]{ _beginTime, _endTimer};

    }

    /**
     * 获取今天的日期
     * @param currentMillisecond 毫秒值
     * @return String
     */
    public static String getTodayDate(long currentMillisecond){

        return DateUtil.format(new Date(currentMillisecond), "yyyy-MM-dd");

    }

    /**
     * 获取现在的时间
     * @param currentMillisecond 毫秒值
     * @return String
     */
    public static String getTodayDateTime(long currentMillisecond){

        return DateUtil.format(new Date(currentMillisecond), "yyyy-MM-dd HH:mm:ss");

    }

    /**
     * 计算某段时间段内有多少天
     * @param beginDate 开始日期
     * @param endDate 结束日期
     * @return long
     */
    public static long getDays(String beginDate, String endDate){

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try{
            long begin = sdf.parse(beginDate).getTime();
            long end = sdf.parse(endDate).getTime();
            long dayMillisecond = 60 * 60 * 24 * 1000L;
            return (end - begin) / dayMillisecond + 1;
        }catch (Exception e){
            log.warn("警告: DateUtils --> getDays");
            return 0;
        }

    }

    /**
     * 获取过去第几天的日期
     * @param past 过去第几天
     * @param date 开始时间
     * @return String
     */
    private static String getPastDate(int past,Date date) {

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - past);
        Date today = calendar.getTime();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        return sdf.format(today);

    }

    /**
     * 获取过去 days 内的日期数组
     * @param currentMillisecond 时间毫秒值
     * @param days 过去几天
     * @return  List<String>
     */
    public static List<String> pastDay(long currentMillisecond, int days){

        try {
            List<String> pastDaysList = new ArrayList<>(days);
            //我这里传来的时间是个string类型的，所以要先转为date类型的。
            SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
            for (int i = days; i > 0; i--) {
                pastDaysList.add(getPastDate(i, sdf.parse(sdf.format(new Date(currentMillisecond)))));
            }
            return pastDaysList;
        }catch (ParseException e){
            log.warn("警告: DateUtils --> pastDay:" + e.getMessage());
            return null;
        }
    }

}
